x86: update Intel CPUID masking code to latest spec
authorJan Beulich <jbeulich@novell.com>
Tue, 19 Jul 2011 13:14:51 +0000 (14:14 +0100)
committerJan Beulich <jbeulich@novell.com>
Tue, 19 Jul 2011 13:14:51 +0000 (14:14 +0100)
..., which adds masking of the xsave feature leaf.

Also add back (and fix to actually make it do what it was supposed to
do from the beginning) the printing of what specific masking couldn't
be done in case the user requested something the hardware doesn't
support.

Signed-off-by: Jan Beulich <jbeulich@novell.com>
xen/arch/x86/cpu/common.c
xen/arch/x86/cpu/cpu.h
xen/arch/x86/cpu/intel.c
xen/include/asm-x86/msr-index.h

index 4cdf289d78843583f5408924c3d0696c11514d1d..d899860eb290162fbd6b5a578e0811f8a4e23991 100644 (file)
@@ -20,10 +20,15 @@ size_param("cachesize", cachesize_override);
 
 static bool_t __cpuinitdata use_xsave = 1;
 boolean_param("xsave", use_xsave);
+
 unsigned int __devinitdata opt_cpuid_mask_ecx = ~0u;
 integer_param("cpuid_mask_ecx", opt_cpuid_mask_ecx);
 unsigned int __devinitdata opt_cpuid_mask_edx = ~0u;
 integer_param("cpuid_mask_edx", opt_cpuid_mask_edx);
+
+unsigned int __devinitdata opt_cpuid_mask_xsave_eax = ~0u;
+integer_param("cpuid_mask_xsave_eax", opt_cpuid_mask_xsave_eax);
+
 unsigned int __devinitdata opt_cpuid_mask_ext_ecx = ~0u;
 integer_param("cpuid_mask_ext_ecx", opt_cpuid_mask_ext_ecx);
 unsigned int __devinitdata opt_cpuid_mask_ext_edx = ~0u;
index a696859ff6ca0f50a040e3910117b7654df552ee..16e99ea36650472b0da893d5b219dce54a52648d 100644 (file)
@@ -22,6 +22,7 @@ struct cpu_dev {
 extern struct cpu_dev * cpu_devs [X86_VENDOR_NUM];
 
 extern unsigned int opt_cpuid_mask_ecx, opt_cpuid_mask_edx;
+extern unsigned int opt_cpuid_mask_xsave_eax;
 extern unsigned int opt_cpuid_mask_ext_ecx, opt_cpuid_mask_ext_edx;
 
 extern int get_model_name(struct cpuinfo_x86 *c);
index 8cc4371d64fa4f43379d01f7baf5e80f22973acb..76b3a3444440cc54cb5cea5a22beb305f74b92a0 100644 (file)
@@ -57,6 +57,9 @@ void set_cpuid_faulting(bool_t enable)
  */
 static void __devinit set_cpuidmask(const struct cpuinfo_x86 *c)
 {
+       u32 eax, edx;
+       const char *extra = "";
+
        if (!~(opt_cpuid_mask_ecx & opt_cpuid_mask_edx &
               opt_cpuid_mask_ext_ecx & opt_cpuid_mask_ext_edx))
                return;
@@ -71,7 +74,11 @@ static void __devinit set_cpuidmask(const struct cpuinfo_x86 *c)
                wrmsr(MSR_INTEL_CPUID_FEATURE_MASK,
                      opt_cpuid_mask_ecx,
                      opt_cpuid_mask_edx);
-               if (!~(opt_cpuid_mask_ext_ecx & opt_cpuid_mask_ext_edx))
+               if (~(opt_cpuid_mask_ext_ecx & opt_cpuid_mask_ext_edx))
+                       extra = "extended ";
+               else if (~opt_cpuid_mask_xsave_eax)
+                       extra = "xsave ";
+               else
                        return;
                break;
 /* 
@@ -92,11 +99,25 @@ static void __devinit set_cpuidmask(const struct cpuinfo_x86 *c)
                wrmsr(MSR_INTEL_CPUID80000001_FEATURE_MASK,
                      opt_cpuid_mask_ext_ecx,
                      opt_cpuid_mask_ext_edx);
+               if (!~opt_cpuid_mask_xsave_eax)
+                       return;
+               extra = "xsave ";
+               break;
+       case 0x2a:
+               wrmsr(MSR_INTEL_CPUID1_FEATURE_MASK_V2,
+                     opt_cpuid_mask_ecx,
+                     opt_cpuid_mask_edx);
+               rdmsr(MSR_INTEL_CPUIDD_01_FEATURE_MASK, eax, edx);
+               wrmsr(MSR_INTEL_CPUIDD_01_FEATURE_MASK,
+                     opt_cpuid_mask_xsave_eax, edx);
+               wrmsr(MSR_INTEL_CPUID80000001_FEATURE_MASK_V2,
+                     opt_cpuid_mask_ext_ecx,
+                     opt_cpuid_mask_ext_edx);
                return;
        }
 
-       printk(XENLOG_ERR "Cannot set CPU feature mask on CPU#%d\n",
-              smp_processor_id());
+       printk(XENLOG_ERR "Cannot set CPU %sfeature mask on CPU#%d\n",
+              extra, smp_processor_id());
 }
 
 void __devinit early_intel_workaround(struct cpuinfo_x86 *c)
index ec1918bf30cf1d39fddd387064b7e9cdba33b368..15c4b8df9314f785afe076578dfd95a25867fb22 100644 (file)
 #define MSR_INTEL_CPUID1_FEATURE_MASK  0x00000130
 #define MSR_INTEL_CPUID80000001_FEATURE_MASK 0x00000131
 
+#define MSR_INTEL_CPUID1_FEATURE_MASK_V2        0x00000132
+#define MSR_INTEL_CPUID80000001_FEATURE_MASK_V2 0x00000133
+#define MSR_INTEL_CPUIDD_01_FEATURE_MASK        0x00000134
+
 /* Intel cpuid faulting MSRs */
 #define MSR_INTEL_PLATFORM_INFO                0x000000ce
 #define MSR_INTEL_MISC_FEATURES_ENABLES        0x00000140